package org.lanqiao.tjut.dynamc_service.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SpokesmanProxyHandler implements InvocationHandler {

	// 被委托对象
	private Object delegate;

	/**
	 * 
	 * @param delegate
	 * @return
	 */
	public Object newProxyInstance(Object delegate) {
		this.delegate = delegate;
		/*
		 * java jdk1.3+ 提供了动态代理类生成类 Proxy：就是用来动态创建一个代理对象的类，它提供了许多的方法，用的最多的就是
		 * newProxyInstance 这个方法 loader:
		 * 一个ClassLoader对象，定义了由哪个ClassLoader对象来对生成的代理对象进行加载 interfaces:
		 * 一个Interface对象的数组，表示的是给需要代理的对象（被委托类）提供一组什么接口，如果提供了一组接口给它，
		 * 那么这个代理对象就宣称实现了该接口(多态)，这样就能调用这组接口中的方法了 h:
		 * 一个InvocationHandler对象，表示的是当这个动态代理对象在调用方法的时候，
		 * 会关联到哪一个InvocationHandler对象（代理类）上
		 */
		return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object result = null;
		try {
			Logger.getLogger(this.getClass().getSimpleName()).log(Level.INFO, new Date() + " 新闻发布会马上开始.");
			// 使用java反射机制，代理类调用被托管类的具体业务方法，来代为管理整体流程，被托管类则需要只关注于自身业务内容即可
			result = method.invoke(delegate, args);
			Logger.getLogger(this.getClass().getSimpleName()).log(Level.INFO, new Date() + " 新闻发布会结束.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

}
